#pragma once
#ifndef _GEOMETRY_2D_LINEPARAM_
#define _GEOMETRY_2D_LINEPARAM_

// Локальные
#include "geometry/2d/point.h"
#include "geometry/2d/vector.h"
#include "core_global.h"

//================================================================================================================================
//================================================================================================================================
namespace geometry
{
    namespace _2d
    {
        /// Прямая в параметрическом виде в двумерном пространстве.
        //
        /// Прямая в параметрическом виде имеет вид \f$A + \vec{B}t\f$, где \f$A\f$ - точка в пространстве, \f$\vec{B}\f$ - вектор,
        /// \f$t\f$ - вещественный параметр.
        /// \sa Point
        /// \sa Vector
        class CORE_EXPORT LineParam
        {
        public:
            /// Создать прямую, выходящую из точки \e point в направлениях \e vector и \e -vector.
            LineParam(Point point, Vector vector) : m_Point(point), m_Vector(vector){}

            /// Создать прямую, проходящую через точки \e p1 и \e p2.
            /// \remarks Значение параметра \e t=0 соответствует точке \e p1, а значение \e t=1 - точке \e p2.
            LineParam(Point p1, Point p2) : m_Point(p1), m_Vector(p1, p2){}

            /// Получить точку прямой, соответствующую параметру \e t.
            Point pos(double t) const {return m_Point.shifted(m_Vector.x()*t, m_Vector.y()*t);}

            /// Поиск пересечения двух параметрически заданных прямых (\e line1 и \e line2).
            //
            /// Пересечение прямых \f$A + \vec{B}t\f$ и \f$C + \vec{D}s\f$, где \f$A=(a_1,a_2)\f$, \f$\vec{B}=(b_1,b_2)\f$,
            /// \f$C=(c_1,c_2)\f$, \f$\vec{D}=(d_1,d_2)\f$ находится как решение системы уравнений
            /// \f{eqnarray*}{ a_1 + b_{1}t & = & c_1 + d_{1}s \\  a_2 + b_{2}t & = & c_2 + d_{2}s \f} откуда
            /// \f[t=\frac{-a_1 + c_1 + d_{1}s}{b_1};\f] \f[s=\frac{(a_2 - c_2)b_1 - (a_1 - c_1)b_2}{d_{2}b_1 - d_{1}b_2}.\f]
            /// \param line1
            /// \param line2
            /// \param[out] t1 Значение параметра первой прямой, соответствующее точке пересечения. Если прямые параллельны - значение не определено.
            /// \param[out] t2 Значение параметра второй прямой, соответствующее точке пересечения. Если прямые параллельны - значение не определено.
            /// \param[out] is_parallel \e true, если прямые параллельны и \e false в противном случае.
            static void findIntersection(const LineParam &line1, const LineParam &line2, double *t1, double *t2, bool *is_parallel);

        private:
            Point m_Point;
            Vector m_Vector;
        };
    }
}

#endif // _GEOMETRY_2D_LINEPARAM_
